﻿/*
	说明：解析xml包，存入子网缓存数据表；并将警报信息插入警报表（有则不插）
	编写：梁宁 2011-03-11

*/
ALTER proc [dbo].[sp_sub_LoadLogData]	
	@Mac nvarchar(40),
	@IP nvarchar(40),
	@dtm datetime,
	@xmldata nvarchar(max),
	@general tinyint=2 --默认2带机
as 
begin 
	DECLARE @idoc int;
	DECLARE @doc nvarchar(1000)	;
	DECLARE @errorMsg nvarchar(500);
	--事务开始
	begin tran 
	--try 开始
	begin try 
	--Create an internal representation of the XML document.
	EXEC sp_xml_preparedocument @idoc OUTPUT, @xmldata

	declare @temptbl table (g nvarchar(30),n int,v numeric(12,2),i numeric(12,2),t numeric(12,2),s nvarchar(30),f bit)
	insert into @temptbl(g,n,v,i,t,s,f)
	SELECT g,n,v,i,t,s,f 
	FROM OPENXML (@idoc, '/data/r',2)----注意大小写!!
				WITH (g nvarchar(30), --电池组
					  n int,  --电池号
					  v numeric(12,2),--电压
					  i numeric(12,2),--电流
					  t numeric(12,2),--温度
					  s nvarchar(30), --状态文本
				      f bit -- 是否报警（0否，1是）
				)
	
	--(1)插入缓冲表
	insert into dbo.S_BatBuffer(Generation,EquipID,BatteryGroup,BatteryID,Vval,Ival,Tval,[Status],LogTime)
	SELECT @general,@Mac,g,n,v,i,t,s,@dtm FROM @temptbl


	--(2)插入警报表(若同一块电池已报警，则不再重复插入;警报记录由手工处理模块,加标记)	
	insert into dbo.S_Warning(EquipID,BatteryGroup,BatteryID,WarningTime,WarningStatus,Note)
		SELECT @Mac,g,n,@dtm,w.StatusDesc,s FROM @temptbl t outer apply dbo.fn_GetWarningStatus_tbl(t.v,t.i,t.t,t.f) w --电池状态通过dbo.fn_GetWarningStatus_tbl函数判断
		  where w.Flag=1 and not exists(select 1 from dbo.S_Warning w where
		 IsActive=1 and w.EquipID=@Mac and w.BatteryGroup=g and w.BatteryID=n )

	--(3)插入电池组缓冲表
	insert into dbo.S_BatgrpBuffer(Generation,EquipID,BatteryGroup,Vval,Ival,Pval,[Status],LogTime,CapDefault,CapFree,TimeFree)
	SELECT @general,@Mac,g,v,i,p,s,@dtm,cd,cf,tf 
	FROM OPENXML (@idoc, '/data/G',2) --注意大小写!!
				WITH (g nvarchar(30), --电池组					 
					  v numeric(12,2),--总电压
					  i numeric(12,2),--总电流
					  p numeric(12,2),--平均电压
					  s nvarchar(30), --状态文本
					  cd numeric(12,2),--额定容量
					  cf numeric(12,2),--剩余容量
					  tf nvarchar(50)--剩余可用时间
				)
	--(4)插入通讯异常信息
		insert into dbo.S_Warning(EquipID,BatteryGroup,BatteryID,WarningTime,WarningStatus,Note,IsActive)
		SELECT @Mac,0,0,@dtm,'通讯异常',isnull(s,''),1 FROM OPENXML (@idoc, '/data/T',2) --注意大小写!!
					WITH (f bit,
						  s nvarchar(100) --状态文本
					) t
			where t.f=1 and not exists(
				select 1 from dbo.S_Warning w where w.EquipID=@Mac and w.Note=t.s and w.IsActive=1)
	--(5)更新主机Mac和IP的对应关系
		exec sp_SaveHostIPMac @Mac,@IP,@dtm

	--try 结束
	end try
	begin catch
		if(@@trancount>0) 
			begin
				print('rollback! ');
				rollback tran --回滚事务
				--记录消息
				set @errorMsg ='Error:'+ERROR_MESSAGE();
			end
	end catch

	if(@@trancount>0) 
	begin
		print('commit! ');
		commit tran --提交事务		
		set @errorMsg='OK';
	end


	-- 插入xml日志
	insert into dbo.S_Xml(DataXml,Error) values(@xmldata,@errorMsg)
end